/**
 * @file batch_writer.h
 * @brief 批量写入器 - 智能批量处理
 */

#ifndef KWDB_BATCH_WRITER_H
#define KWDB_BATCH_WRITER_H

#include "data_point.h"
#include "grpc_client.h"
#include "exceptions.h"

#include <vector>
#include <mutex>
#include <condition_variable>
#include <thread>
#include <atomic>
#include <chrono>
#include <queue>

namespace kwdb {

/**
 * @brief 批量写入器
 * 
 * 提供智能批量处理功能：
 * - 自动批量聚合
 * - 超时触发
 * - 异步处理
 * - 背压控制
 */
class BatchWriter {
public:
    /**
     * @brief 构造函数
     * @param config 客户端配置
     * @param grpcClient gRPC客户端
     */
    BatchWriter(const ClientConfig& config, GrpcClient& grpcClient);
    
    /**
     * @brief 析构函数
     */
    ~BatchWriter();
    
    /**
     * @brief 启动批量写入器
     */
    void start();
    
    /**
     * @brief 停止批量写入器
     */
    void stop();
    
    /**
     * @brief 添加数据点到批量队列
     * @param dataPoint 数据点
     * @throws KWDBException 添加异常
     */
    void addDataPoint(const DataPoint& dataPoint);
    
    /**
     * @brief 强制刷新批量队列
     * @throws KWDBException 刷新异常
     */
    void flush();
    
    /**
     * @brief 获取当前批量大小
     * @return 批量大小
     */
    size_t getCurrentBatchSize() const;
    
    /**
     * @brief 获取队列中的数据点数量
     * @return 数据点数量
     */
    size_t getQueueSize() const;
    
    /**
     * @brief 检查是否正在运行
     * @return 是否运行中
     */
    bool isRunning() const;

private:
    const ClientConfig& config_;
    GrpcClient& grpcClient_;
    
    // 批量队列
    std::queue<DataPoint> dataQueue_;
    mutable std::mutex queueMutex_;
    std::condition_variable queueCondition_;
    
    // 工作线程
    std::thread workerThread_;
    std::atomic<bool> running_;
    std::atomic<bool> shutdown_;
    
    // 统计信息
    std::atomic<size_t> totalWritten_;
    std::atomic<size_t> totalBatches_;
    std::atomic<size_t> totalErrors_;
    
    /**
     * @brief 工作线程主循环
     */
    void workerLoop();
    
    /**
     * @brief 处理批量数据
     * @param batch 批量数据
     */
    void processBatch(const std::vector<DataPoint>& batch);
    
    /**
     * @brief 获取批量数据
     * @param maxSize 最大批量大小
     * @param timeout 超时时间
     * @return 批量数据
     */
    std::vector<DataPoint> getBatch(size_t maxSize, std::chrono::milliseconds timeout);
    
    /**
     * @brief 检查是否应该刷新批量
     * @return 是否应该刷新
     */
    bool shouldFlush() const;
};

} // namespace kwdb

#endif // KWDB_BATCH_WRITER_H
